home *** CD-ROM | disk | FTP | other *** search
/ Aminet 40 / Aminet 40 (2000)(Schatztruhe)[!][Dec 2000].iso / Aminet / util / cdity / MRQ.lha / MRQ / Source / RCS / Requesters.c < prev    next >
C/C++ Source or Header  |  2000-10-16  |  35KB  |  1,281 lines

  1. head    1.4;
  2. access;
  3. symbols;
  4. locks
  5.     msbethke:1.4; strict;
  6. comment    @ * @;
  7.  
  8.  
  9. 1.4
  10. date    2000.10.15.18.06.08;    author msbethke;    state Exp;
  11. branches;
  12. next    1.3;
  13.  
  14. 1.3
  15. date    2000.03.30.23.18.43;    author msbethke;    state Exp;
  16. branches;
  17. next    1.2;
  18.  
  19. 1.2
  20. date    2000.01.25.17.30.22;    author msbethke;    state Exp;
  21. branches;
  22. next    1.1;
  23.  
  24. 1.1
  25. date    2000.01.25.16.57.49;    author msbethke;    state Exp;
  26. branches;
  27. next    ;
  28.  
  29.  
  30. desc
  31. @The Real Work(tm) is done here!
  32. @
  33.  
  34.  
  35. 1.4
  36. log
  37. @Structured the button generation part a little better
  38. (actually this should have long gone into a MUI class of its own :-( )
  39. Now uses my own reentrant strtok()-function, not yet everywhere though.
  40. @
  41. text
  42. @/* Requesters.c
  43. ** This is where the real work is done!
  44. ** - Functions patched into intuition and reqtools.library
  45. ** - Functions to build a MUI requester according to an
  46. **   MRQReqMessage structure
  47. ** - Message handling
  48. **
  49. ** ©1997-2000 by Matthias.Bethke <Matthias.Bethke@@gmx.net>
  50. ** You are free to modify this source or use parts of it in your
  51. ** own programs as long as they are distributed as freeware.
  52. */
  53.  
  54. /* $Id: Requesters.c 1.3 2000/03/30 23:18:43 msbethke Exp msbethke $
  55. **
  56. ** $Log: Requesters.c $
  57. ** Revision 1.3  2000/03/30 23:18:43  msbethke
  58. ** Changed NewImage.mcc -> Guigfx.mcc
  59. **
  60. ** Revision 1.2  2000/01/25 17:30:22  msbethke
  61. ** Adapted to new header names
  62. ** Fixed obsolete NewImage.mcc tag names/structures
  63. **
  64. ** Revision 1.1  2000/01/25 16:57:49  msbethke
  65. ** Initial revision
  66. **
  67. */
  68.  
  69.  
  70. #include <proto/utility.h>
  71. #include <exec/memory.h>
  72. #include <exec/alerts.h>
  73. #include <intuition/intuition.h>
  74. #include <intuition/intuitionbase.h>
  75. #include <libraries/reqtools.h>
  76. #include <lib/mb_utils.h>
  77. #include <MUI/Guigfx_mcc.h>
  78. #include <MUI/TransferAnim_mcc.h>
  79. #include <math.h>
  80. #include <ctype.h>
  81.  
  82. #include "muistuff.h"
  83. #include "mrq.h"
  84. #include "config.h"
  85. #include "gfxfiles.h"
  86. #include "MRQasm.h"
  87. #include "mui_macros.h"
  88.  
  89. /************************************************************************/
  90. /* local protos                                                         */
  91. /************************************************************************/
  92. static struct MRQReqMessage *CreateMsgAndPort(ULONG);
  93. static STRPTR GetCallingProgram(APTR);
  94. static void FreeMsgAndPort(struct MRQReqMessage*);
  95. static BOOL CheckAvoidTask(struct Task*);
  96. static STRPTR FormatButtonText(STRPTR, APTR);
  97. static struct MRQEventClass *AnalyzeReqText(STRPTR,STRPTR);
  98. static APTR CreateMRQButton(STRPTR, BOOL, BOOL, struct Screen*, UBYTE, BOOL);
  99. static APTR CreateImageButton(STRPTR,struct MRQImageButton*, struct Screen*, UBYTE, BOOL);
  100. static APTR CreateTextButton(STRPTR, UBYTE, BOOL);
  101. static WORD PreParseButtonText(STRPTR, UBYTE, BOOL, STRPTR*, STRPTR*);
  102.  
  103. /*****************************************************************************/
  104.  
  105. #define GADBUFSIZE (256)
  106.  
  107. /*****************************************************************************/
  108.  
  109. LONG __asm __saveds EasyRequestArgsPatch(
  110.     register __a0 struct Window *ParentWindow,
  111.     register __a1 struct EasyStruct *es,
  112.     register __a2 ULONG *IDCMPptr,
  113.     register __a3 APTR ArgList)
  114. {
  115. static const struct EasyStruct easy = {sizeof(struct EasyStruct),0,"System error",
  116. "EasyRequestArgs() called by %s\nwith %s == NULL!","I see"};
  117. struct MRQReqMessage *msg;
  118. struct Window *pwindow;        // temp parent window
  119. struct Task *MyTask;
  120. STRPTR TaskName;
  121. LONG RCode = -1;
  122.  
  123.     MyTask = FindTask(NULL);
  124.     TaskName = MyTask->tc_Node.ln_Name ? MyTask->tc_Node.ln_Name : "<UNKNOWN>";
  125.  
  126.     pwindow = ParentWindow;
  127.  
  128. //    if((MyTask->tc_Node.ln_Type == NT_PROCESS) && (!pwindow))
  129. //        pwindow = ((struct Process*)MyTask)->pr_WindowPtr;
  130.  
  131.     if(pwindow == (struct Window*)-1) pwindow = NULL;
  132.  
  133.     prdebug("EasyRequestArgs patch entered by '%s'\n",TaskName);
  134.  
  135.     if(CheckAvoidTask(MyTask) || (!AppActive))
  136.     {
  137.         return CallOldERA(ParentWindow,es,IDCMPptr,ArgList,IntuitionBase); // use standard intuition
  138.     }
  139.  
  140.     if(!es->es_GadgetFormat)
  141.     {
  142.         EasyRequest(ParentWindow,(struct EasyStruct*)&easy,NULL,TaskName,"es_GadgetFormat");
  143.         return -1L;
  144.     }
  145.     if(!es->es_TextFormat)
  146.     {
  147.         EasyRequest(ParentWindow,(struct EasyStruct*)&easy,NULL,TaskName,"es_TextFormat");
  148.         return -1L;
  149.     }
  150.  
  151.     if(msg = CreateMsgAndPort(IDCMPptr?*IDCMPptr:0L))
  152.     {
  153.         /* fill message structure */
  154.         msg->mrm_Easy            = es;
  155.         msg->mrm_ParentWin    = pwindow;
  156.         msg->mrm_ArgList        = ArgList;
  157.         msg->mrm_CalledFrom    = CALLER_EASYREQUESTARGS;
  158.         msg->mrm_DefaultAnswer = 1;
  159.  
  160.         PutMsg(MainPort,(struct Message*)msg);
  161.         prdebug("Message sent\n");
  162.         WaitPort(msg->mrm_Message.mn_ReplyPort);
  163.         GetMsg(msg->mrm_Message.mn_ReplyPort);
  164.         prdebug("Received reply\n");
  165.  
  166.         RCode = msg->mrm_RCode;
  167.         if(msg->mrm_FatalError)
  168.         {
  169.             prdebug("Fatal error in MUI requester code - using original function!\n");
  170.             RCode = CallOldERA(ParentWindow,es,IDCMPptr,ArgList,IntuitionBase);
  171.         }
  172.         FreeMsgAndPort(msg);
  173.     }
  174.     prdebug("EasyRequestArgsPatch() result: %ld\n",RCode);
  175.     return RCode;
  176. }
  177.  
  178.  
  179. /*****************************************************************************/
  180.  
  181. ULONG __asm __saveds rtEZRequestAPatch(
  182.     register __a1 char *bodyfmt,
  183.     register __a2 char *gadfmt,
  184.     register __a3 struct rtReqInfo *reqinfo,
  185.     register __a5 APTR argarray,                    // usually a4 - requires asm stub!!!
  186.     register __a0 struct TagItem *taglist)
  187. {
  188. struct MRQReqMessage *msg;
  189. struct Window *pwindow=NULL;
  190. struct Task *MyTask;
  191. STRPTR TaskName;
  192. ULONG RCode = -1;
  193. ULONG IDCMPflags=0, IDCMPsaved=0, ReqFlags=0;
  194. BOOL WaitPointer=FALSE, LockWindow=FALSE;
  195. struct TagItem *tlist, *tag;
  196. STRPTR ReqTitle=NULL;
  197. UBYTE rtUnderscore=0, DefaultAnswer=1;
  198.  
  199.     MyTask = FindTask(NULL);
  200.     TaskName = MyTask->tc_Node.ln_Name ? MyTask->tc_Node.ln_Name : "<UNKNOWN>";
  201.  
  202.     if(taglist)    pwindow = (struct Window*)GetTagData(RT_Window,0,taglist);
  203.  
  204. //    if((MyTask->tc_Node.ln_Type == NT_PROCESS) && (!pwindow))
  205. //        pwindow = ((struct Process*)MyTask)->pr_WindowPtr;
  206.  
  207.     if(pwindow == (struct Window*)-1) pwindow=NULL;
  208.  
  209.     prdebug("rtEZRequestA patch entered by '%s'\n",TaskName);
  210.  
  211.     /* avoid certain tasks, buttonless/asynchronous requesters, and honor AppActive */
  212.     if(CheckAvoidTask(MyTask) ||
  213.         !(AppActive && gadfmt) ||
  214.         FindTagItem(RT_ReqHandler,taglist))
  215.     {
  216.         prdebug("Requester not MUIfiable - calling original function!\n");
  217.         return CallOldrtEZRA(bodyfmt,gadfmt,reqinfo,argarray,taglist,ReqToolsBase);
  218.     }
  219.  
  220.     if(!bodyfmt)
  221.     {
  222.     struct EasyStruct easy = {sizeof(struct EasyStruct),0,"MRQ error","rtEZRequestA() called by %s\nwith bodyfmt == NULL!","I see"};
  223.  
  224.         EasyRequest(NULL,&easy,NULL,TaskName);
  225.         return -1L;
  226.     }
  227.  
  228.     if(reqinfo)
  229.     {
  230.         ReqTitle = reqinfo->ReqTitle;
  231.         WaitPointer = reqinfo->WaitPointer;
  232.         LockWindow = reqinfo->LockWindow;
  233.         ReqFlags = reqinfo->Flags;
  234.     }
  235.  
  236.     tlist = taglist;
  237.     while(tag = NextTagItem(&tlist))
  238.     {
  239.         switch(tag->ti_Tag)
  240.         {
  241.             case  RT_IDCMPFlags    : IDCMPflags = tag->ti_Data;
  242.                 prdebug("IDCMPflags wanted: %08.lx\n",IDCMPflags);
  243.                 break;
  244.             case  RT_WaitPointer    : WaitPointer = tag->ti_Data;
  245.                 break;
  246.             case  RT_LockWindow    : LockWindow = tag->ti_Data;
  247.                 break;
  248.             case RT_Underscore    : rtUnderscore = (UBYTE)tag->ti_Data;
  249.                 break;
  250.             case RTEZ_ReqTitle    : ReqTitle = (STRPTR)tag->ti_Data;
  251.                 break;
  252.             case RTEZ_Flags        :
  253.                 if(tag->ti_Data & EZREQF_CENTERTEXT)  ReqFlags |= MRQMF_CENTERTEXT;
  254.                 if(tag->ti_Data & EZREQF_NORETURNKEY) ReqFlags |= MRQMF_NORETURNKEY;
  255.                 break;
  256.             case RTEZ_DefaultResponse : DefaultAnswer = tag->ti_Data;
  257.                 break;
  258.         }
  259.     }
  260.  
  261.     if(pwindow)
  262.     {
  263.         if(WaitPointer || LockWindow)
  264.         {
  265.             SetWindowPointer(pwindow,WA_BusyPointer,TRUE,TAG_DONE);
  266.         }
  267.         if(LockWindow)
  268.         {
  269.             IDCMPsaved = pwindow->IDCMPFlags;
  270.             ModifyIDCMP(pwindow,0);                // turn off all IDCMP messages
  271.         }
  272.     }
  273.  
  274.     if(msg = CreateMsgAndPort(IDCMPflags))
  275.     {
  276.     struct EasyStruct es = {0};
  277.  
  278.         /* fake an EasyStruct :) */
  279.         es.es_TextFormat = bodyfmt;
  280.         es.es_GadgetFormat = gadfmt ? gadfmt : "OK";        // gadfmt may be NULL!
  281.         es.es_Title = ReqTitle;
  282.  
  283.         /* fill message structure */
  284.         msg->mrm_Easy                = &es;
  285.         msg->mrm_ArgList            = argarray;
  286.         msg->mrm_CalledFrom        = CALLER_RTEZREQUESTA;
  287.         msg->mrm_ParentWin        = pwindow;
  288.         msg->mrm_Flags                = ReqFlags;
  289.         msg->mrm_Underscore        = rtUnderscore;
  290.         msg->mrm_DefaultAnswer    = DefaultAnswer;
  291.  
  292.         PutMsg(MainPort,(struct Message*)msg);
  293.         prdebug("Message sent\n");
  294.         WaitPort(msg->mrm_Message.mn_ReplyPort);
  295.         GetMsg(msg->mrm_Message.mn_ReplyPort);
  296.         prdebug("Received reply\n");
  297.  
  298.         RCode = msg->mrm_RCode;
  299.         if(msg->mrm_FatalError)
  300.         {
  301.             prdebug("Fatal error in MUI requester code - using original function!\n");
  302.             RCode = CallOldrtEZRA(bodyfmt,gadfmt,reqinfo,argarray,taglist,ReqToolsBase);
  303.         }
  304.         FreeMsgAndPort(msg);
  305.     } else prdebug("Can't create message/port!\n");
  306.     if(pwindow)
  307.     {
  308.         if(WaitPointer || LockWindow) ClearPointer(pwindow);        // reqtools compatible
  309.         if(LockWindow) ModifyIDCMP(pwindow,IDCMPsaved);
  310.     }
  311.     prdebug("rtEZRequestAPatch() result: %ld\n",RCode);
  312.     return RCode;
  313.  
  314.  
  315. }
  316.  
  317. /*****************************************************************************
  318. ** GetCallingProgram()                                                       *
  319. ** Returns a pointer to the calling program's name (including directory),    *
  320. ** in a newly allocted buffer. Deallocate with FreeString() (mb_utils.lib)   *
  321. ** Parameters: pool : optional mempool to allocate buffer from               *
  322. ******************************************************************************/
  323. static STRPTR GetCallingProgram(APTR pool)
  324. {
  325. STRPTR ProgName, ProgDir, Path=NULL;
  326. BPTR DirLock;
  327.  
  328.     if(DirLock = GetProgramDir())
  329.     {
  330.     ULONG len;
  331.  
  332.         ProgDir    = mb_NameFromLock(pool,DirLock);
  333.         ProgName    = mb_GetProgramName(pool);
  334.         if(Path=AllocVecPooled(pool,len=strlen(ProgDir)+1+strlen(ProgName)+1))
  335.         {
  336.             strcpy(Path,ProgDir);
  337.             if(!(AddPart(Path,ProgName,len)))
  338.             {
  339.                 FreeVecPooled(pool,Path);
  340.                 Path = NULL;
  341.             }
  342.         }
  343.         FreeString(pool,ProgDir);
  344.         FreeString(pool,ProgName);
  345.     }
  346.     return Path;
  347. }
  348.  
  349. /*****************************************************************************
  350. ** CreateMsgAndPort()                                                        *
  351. ** Allocates a struct MRQReqMessage already filled with info common to all   *
  352. ** patches.                                                                  *
  353. ** Parameters: IDCMPFlags : IDCMP flags to terminate the requester           *
  354. ******************************************************************************/
  355.  
  356. static struct MRQReqMessage *CreateMsgAndPort(ULONG IDCMPflags)
  357. {
  358. struct MRQReqMessage *msg;
  359.  
  360.     /* allocate a message structure */
  361.     if(msg = AllocVec(sizeof(struct MRQReqMessage),MEMF_PUBLIC|MEMF_CLEAR)) // important for VMem systems!
  362.     {
  363.     struct MsgPort *RPort;
  364.  
  365.         /* create a reply port */
  366.         if(RPort = CreateMsgPort())
  367.         {
  368.             msg->mrm_Message.mn_ReplyPort = RPort;
  369.  
  370.             /* common to all patches, so let's do it here! */
  371.             msg->mrm_CallingProgram = GetCallingProgram(Config->mc_MemPool);
  372.  
  373.             if(IDCMPflags)
  374.             {
  375.             struct MUI_EventHandlerNode *meh;
  376.  
  377.                 /* allocate an EventHandlerNode if any IDCMP bits were requested */
  378.                 if(meh = AllocVec(sizeof(struct MUI_EventHandlerNode),MEMF_PUBLIC|MEMF_CLEAR))
  379.                 {
  380.                     meh->ehn_Priority    = 0;
  381.                     meh->ehn_Flags        = 0;
  382.                     meh->ehn_Events    = IDCMPflags;
  383.                     meh->ehn_Class        = NULL;
  384.                     msg->mrm_EventHandler = meh;
  385.                     prdebug("IDCMP flags requested (0x%08.lx), eventhandler initialized\n",IDCMPflags);
  386.                 } else Alert(AG_NoMemory);
  387.             }
  388.             return msg;
  389.         } else prdebug("Error creating reply port!\n");
  390.         FreeVec(msg);
  391.     } else Alert(AG_NoMemory);
  392.     return NULL;
  393. }
  394.  
  395.  
  396.  
  397. /*****************************************************************************
  398. ** FreeMsgAndPort()                                                          *
  399. ** Frees a struct MRQReqMessage allocated by CreateMsgAndPort()              *
  400. ******************************************************************************/
  401. static void FreeMsgAndPort(struct MRQReqMessage *msg)
  402. {
  403.     DeleteMsgPort(msg->mrm_Message.mn_ReplyPort);
  404.     if(msg->mrm_EventHandler) FreeVec(msg->mrm_EventHandler);
  405.     if(msg->mrm_CallingProgram) FreeString(Config->mc_MemPool,msg->mrm_CallingProgram);
  406.     FreeVec(msg);
  407. }
  408.  
  409.  
  410. /*****************************************************************************
  411. ** CheckAvoidTask()                                                          *
  412. ** Checks if the passed-in task matches the preconfigured AVOIDTASKS pattern *
  413. ** Parameters: task : task to check                                          *
  414. ** Returns TRUE if task matches pattern                                      *
  415. ******************************************************************************/
  416. static BOOL CheckAvoidTask(struct Task *task)
  417. {
  418.     if(ttVars.AvoidTasks)
  419.     {
  420.     UBYTE buf[256], *name;
  421.  
  422.         name = task->tc_Node.ln_Name;
  423.  
  424.         if(task->tc_Node.ln_Type == NT_PROCESS)
  425.         {
  426.             if(GetProgramName(buf,sizeof(buf)) && strlen(buf))
  427.             {
  428.                 name = buf;
  429.             }
  430.         }
  431.  
  432.         if(name)
  433.         {
  434.             if(MatchPattern(ttVars.AvoidTasks,name))
  435.             {
  436.                 prdebug("Task name \"%s\" matches AVOIDTASKS list!\n",name);
  437.                 return TRUE;
  438.             }
  439.         }
  440.     }
  441.     return FALSE;
  442. }
  443.  
  444. /*****************************************************************************/
  445.  
  446. /************************************************************************
  447. **
  448. ** MUI_EasyRequestArgs()
  449. ** Since MRQ V1.5 this is no longer a replacement function for
  450. ** EasyRequestArgs() but must be called by the MRQ process!
  451. **    Generalized for a couple of other requester functions, thus
  452. ** supporting features not present in EasyRequestArgs(), as of V1.7
  453. *************************************************************************/
  454. BOOL MUI_EasyRequestArgs(struct MRQReqMessage *msg)
  455. {
  456. STRPTR Title, TextFormat, GadgetFormat;
  457. UBYTE tbuf[1024];
  458. struct MRQEventClass *EventClass, DynEventClass;
  459. struct MRQImage *ReqImage;
  460. struct MUIP_Guigfx_ImageInfo IconImageInfo;
  461. struct Screen *scr;
  462. struct DiskObject *ProgramIcon=NULL;
  463. APTR ButtonArgs;
  464. BOOL IconShown=FALSE;
  465. struct StuffCharParams StuffCharParams;
  466. APTR Win, BtGrp, ReqImgObj;
  467.  
  468.     Title            = msg->mrm_Easy->es_Title;
  469.     TextFormat    = msg->mrm_Easy->es_TextFormat;
  470.     GadgetFormat= msg->mrm_Easy->es_GadgetFormat;
  471.  
  472.     if(ttVars.FrontmostScreen)
  473.     {
  474.     ULONG lock;
  475.  
  476.         lock = LockIBase(0);
  477.         scr = ((struct IntuitionBase*)(IntuitionBase))->FirstScreen;
  478.         UnlockIBase(lock);
  479.     } else
  480.     {
  481.         if(msg->mrm_ParentWin)
  482.         {
  483.             scr = msg->mrm_ParentWin->WScreen;
  484.         } else
  485.         {
  486.             msg->mrm_ReqScreen = scr = LockPubScreen(NULL);
  487.         }
  488.     }
  489.  
  490.     StuffCharParams.Position= 0;
  491.     StuffCharParams.Dest        = tbuf;
  492.     StuffCharParams.DestLen    = sizeof(tbuf);
  493.     ButtonArgs = RawDoFmt(TextFormat,msg->mrm_ArgList,&RDF_StuffChar,&StuffCharParams);
  494.  
  495.     EventClass = AnalyzeReqText(TextFormat,tbuf);
  496.  
  497.     if((EventClass == &Config->mc_DefClass) && msg->mrm_CallingProgram)
  498.     {
  499.         prdebug("default class - trying icon\n",msg->mrm_CallingProgram);
  500.         if(ProgramIcon = GetDiskObject(msg->mrm_CallingProgram))
  501.         {
  502.             prdebug("icon read\n");
  503.             if(ProgramIcon->do_Gadget.Flags & GFLG_GADGIMAGE)
  504.             {
  505.                 prdebug("image gadget found\n");
  506.                 memset(&DynEventClass,0,sizeof(struct MRQEventClass));            // clear
  507.                 IconImageInfo.Version = GUIGFX_IMAGEINFO_VERSION;
  508.                 IconImageInfo.Image = ProgramIcon->do_Gadget.GadgetRender;        // enter image pointer
  509.                 IconImageInfo.ColorTable = (ULONG*)MUIV_Guigfx_WBPalette;        // we want a new WB-like palette
  510.                 DynEventClass.mec_Image.mi_Object = &IconImageInfo;
  511.                 EventClass = &DynEventClass;
  512.                 IconShown = TRUE;
  513.             } else
  514.             {
  515.                 prdebug("Not an image gadget!\n");
  516.                 FreeDiskObject(ProgramIcon);
  517.             }
  518.         } else prdebug("Can't read icon for %s!\n",msg->mrm_CallingProgram);
  519.     }
  520.  
  521.     ReqImage = msg->mrm_ReqImage = &EventClass->mec_Image;
  522.  
  523.     prdebug("Final requester text: \"%s\"\nMatched for image: %s\n",
  524.         tbuf,(ReqImage->mi_Flags & MIF_FILENAME) ? ReqImage->mi_Object : (STRPTR)"<preloaded>");
  525.  
  526.     if(!Title) Title = (UBYTE*)((strchr(GadgetFormat,'|'))?"Request":"Information");
  527.  
  528.     if(ReqImage->mi_Flags & MIF_ANIMATION)
  529.     {
  530.         ReqImgObj = TransferAnimObject,
  531.                             MUIA_TransferAnim_File, ReqImage->mi_Object,
  532.                             MUIA_TransferAnim_FPS, 10,
  533.                         End;
  534.     } else
  535.     {
  536.         ReqImgObj = GuigfxObject,
  537.                             (ReqImage->mi_Flags & MIF_FILENAME) ?
  538.                                 MUIA_Guigfx_FileName :
  539.                                 IconShown ?
  540.                                     MUIA_Guigfx_ImageInfo :
  541.                                     MUIA_Guigfx_Picture,
  542.                             ReqImage->mi_Object,
  543.                             MUIA_Guigfx_ScaleMode, GGSMF_NONE,
  544.                             MUIA_Guigfx_Quality, ttVars.Quality,
  545.                             MUIA_Guigfx_Transparency, ttVars.Transparency ? GGTRF_MASK : 0,
  546.                         End;
  547.     }
  548.  
  549.     Win = MRQWindowObject,
  550.         MUIA_Window_Title, Title,
  551.         MUIA_Window_ScreenTitle, Title,
  552.         MUIA_Window_Screen, scr,
  553.         MUIA_Window_TopEdge, ttVars.MousedReq ? MUIV_Window_TopEdge_Moused : MUIV_Window_TopEdge_Centered,
  554.         MUIA_Window_LeftEdge, ttVars.MousedReq? MUIV_Window_LeftEdge_Moused: MUIV_Window_LeftEdge_Centered,
  555.         MUIA_Window_CloseGadget, FALSE,
  556.         MUIA_Window_SizeGadget, ttVars.Sizeable,
  557.         WindowContents, VGroup,
  558.             Child, HGroup,
  559.                 MUIA_Frame, ttVars.SingleFrame ? MUIV_Frame_Text : MUIV_Frame_None,
  560.                 Child, VGroup,
  561.                     GroupSpacing(0),
  562.                     MUIA_Frame, ttVars.SingleFrame ? MUIV_Frame_None : MUIV_Frame_Text,
  563.                     Child, RectangleObject,    End,
  564.                     Child, ReqImgObj,
  565.                     Child, RectangleObject, End,
  566.                 End,
  567.                 Child, VGroup,
  568.                     GroupSpacing(0),
  569.                     MUIA_Frame, ttVars.SingleFrame ? MUIV_Frame_None : MUIV_Frame_Text,
  570.                     MUIA_Background, MUII_TextBack,
  571.                     Child, VSpace(0),
  572.                     Child, TextObject,
  573.                         MUIA_Text_Contents, tbuf,
  574.                         MUIA_Text_PreParse, ((!strchr(tbuf,'\n'))    ||
  575.                                                     ttVars.Centered        ||
  576.                                                     (msg->mrm_Flags & MRQMF_CENTERTEXT)) ? "\33c" : "\33l",
  577.                     End,
  578.                     Child, VSpace(0),
  579.                 End,
  580.             End,
  581.             Child, MUI_MakeObject(MUIO_HBar,5),
  582.             Child, BtGrp = HGroup,
  583.                 MUIA_Group_SameWidth, ttVars.SameWidthButtons,
  584.                 MUIA_Group_SameHeight, TRUE,
  585.             End,
  586.         End,
  587.     End;
  588.     
  589.     if(IconShown)
  590.     {
  591.         FreeDiskObject(ProgramIcon);
  592.         prdebug("Freed icon\n");
  593.     }
  594.  
  595.     if(Win)
  596.     {
  597.     STRPTR GadgetsText;
  598.  
  599.         prdebug("Created window object @@$%08lx\n",Win);
  600.  
  601.         msg->mrm_WindowObject = Win;
  602.  
  603.         set(Win,MRQWINDOWTAG_REQMESSAGE,msg);    /* keep this *before* the AddEventHandler call! */
  604.         if(msg->mrm_EventHandler)
  605.         {
  606.             msg->mrm_EventHandler->ehn_Object = Win;
  607.             DoMethod(Win,MUIM_Window_AddEventHandler,msg->mrm_EventHandler);
  608.             prdebug("IDCMP bits requested by caller: %08lx\n",msg->mrm_EventHandler->ehn_Events);
  609.         }
  610.  
  611.         if(GadgetsText = FormatButtonText(GadgetFormat, ButtonArgs))
  612.         {
  613.         char *ThisButton, *NextButton=GadgetsText;
  614.         APTR TButtonP;
  615.         BOOL defaultbutton, ButtonOK=TRUE;
  616.         int i;
  617.  
  618.             ThisButton = mb_strtok(&NextButton,"|");
  619.             for(    i=0;
  620.                     (ThisButton != NULL) && (i < MAXBUTTONS);
  621.                     ThisButton = mb_strtok(&NextButton,"|"),i++)
  622.             {
  623.                 /* try to create a new MUI button */
  624.                 defaultbutton = (msg->mrm_DefaultAnswer==i+1) || ((NextButton==NULL) && (msg->mrm_DefaultAnswer==0));
  625.                 TButtonP = CreateMRQButton(ThisButton,(i==0),(NextButton==NULL),scr,msg->mrm_Underscore,defaultbutton);
  626.  
  627.                 if(TButtonP)
  628.                 {
  629.                     DoMethod(BtGrp,OM_ADDMEMBER,TButtonP);
  630.  
  631.                     DoMethod(TButtonP,MUIM_Notify,MUIA_Pressed,FALSE,TButtonP,3,
  632.                                 MUIM_WriteLong,(NextButton||!i) ? i+1 : 0,&msg->mrm_RCode);
  633.  
  634.                     DoMethod(TButtonP,MUIM_Notify,MUIA_Pressed,FALSE,Application,2,
  635.                                 MUIM_Application_ReturnID,msg);
  636.  
  637.                     if(i<10)
  638.                     {
  639.                     ULONG fstring=MAKE_ID('f',0,0,0);
  640.                     
  641.                         if(i==9) fstring |= MAKE_ID(0,'1','0',0);
  642.                         else fstring |= (i+1+'0')<<16;
  643.  
  644.                         DoMethod(Win,MUIM_Notify,MUIA_Window_InputEvent,&fstring,
  645.                                     Win,3,MUIM_WriteLong,(NextButton||!i) ? i+1 : 0,&msg->mrm_RCode);
  646.  
  647.                         DoMethod(Win,MUIM_Notify,MUIA_Window_InputEvent,&fstring,
  648.                                     Application,2,MUIM_Application_ReturnID,msg);
  649.                     }
  650.  
  651.                     if(defaultbutton && (!(msg->mrm_Flags & MRQMF_NORETURNKEY)))
  652.                         set(Win,MUIA_Window_ActiveObject,TButtonP);
  653.                 } else
  654.                 {
  655.                     ButtonOK = FALSE;
  656.                     break;
  657.                 }
  658.             }
  659.  
  660.             if(ButtonOK)
  661.             {
  662.                 if(EventClass->mec_RxCmdString)
  663.                 {
  664.                     msg->mrm_ARexxPort= EventClass->mec_RxPortName ? EventClass->mec_RxPortName : (STRPTR)"PLAY";
  665.                     msg->mrm_ARexxCmd    = EventClass->mec_RxCmdString;
  666.                 }
  667.  
  668.                 DoMethod(Application,OM_ADDMEMBER,Win);
  669.  
  670.                 prdebug("Added window to application object\n");
  671.  
  672.                 DoMethod(Win,MUIM_Notify,MUIA_Window_InputEvent,"esc",
  673.                             Win,3,MUIM_WriteLong,0,&msg->mrm_RCode);
  674.                 DoMethod(Win,MUIM_Notify,MUIA_Window_InputEvent,"esc",
  675.                             Application,2,MUIM_Application_ReturnID,msg);
  676.  
  677.                 DoMethod(Win,MUIM_Notify,MUIA_Window_InputEvent,"lcommand v",
  678.                             Win,3,MUIM_WriteLong,1,&msg->mrm_RCode);
  679.                 DoMethod(Win,MUIM_Notify,MUIA_Window_InputEvent,"lcommand v",
  680.                             Application,2,MUIM_Application_ReturnID,msg);
  681.  
  682.                 DoMethod(Win,MUIM_Notify,MUIA_Window_InputEvent,"lcommand b",
  683.                             Win,3,MUIM_WriteLong,0,&msg->mrm_RCode);
  684.                 DoMethod(Win,MUIM_Notify,MUIA_Window_InputEvent,"lcommand b",
  685.                             Application,2,MUIM_Application_ReturnID,msg);
  686.  
  687.  
  688.                 set(Win,MUIA_Window_Open,TRUE);
  689.             } else
  690.             {
  691.                 prdebug("Error creating button objects!\n");
  692.                 msg->mrm_FatalError = TRUE;
  693.             }
  694.             FreeVec(GadgetsText);
  695.         } else 
  696.         {
  697.             prdebug("Can't format gadget text!\n");
  698.             msg->mrm_FatalError = TRUE;
  699.         }
  700.     } else
  701.     {
  702.         prdebug("Can't create window object!\n");
  703.         msg->mrm_FatalError = TRUE;
  704.     }
  705.  
  706.     if(!(ttVars.FrontmostScreen || msg->mrm_ParentWin)) UnlockPubScreen(NULL,scr);
  707.     return (BOOL)(!msg->mrm_FatalError);
  708. }
  709.  
  710. static STRPTR FormatButtonText(STRPTR GadgetFormat, APTR BtArgs)
  711. {
  712. STRPTR tbuf;
  713. struct StuffCharParams scp;
  714.  
  715.     if(tbuf = AllocVec(GADBUFSIZE,MEMF_ANY))
  716.     {
  717.         scp.Position= 0;
  718.         scp.Dest        = tbuf;
  719.         scp.DestLen = GADBUFSIZE;
  720.         RawDoFmt(GadgetFormat,BtArgs,&RDF_StuffChar,&scp);
  721.     }
  722.     return tbuf;
  723. }
  724.  
  725. /************************************************************************
  726. ** AnalyzeReqText()
  727. ** This short piece of code is MRQ's "core", the text analyzer. It
  728. ** matches all strings in all MRQ event class structures against the
  729. ** supplied requester texts and returns a pointer to the first class that
  730. ** matches.
  731. *************************************************************************/
  732. static struct MRQEventClass *AnalyzeReqText(STRPTR Text, STRPTR FormattedText)
  733. {
  734. struct MRQEventClass *class;
  735. struct MRQString *str;
  736. BOOL match;
  737. STRPTR tx;
  738.  
  739.     for(class=(struct MRQEventClass*)(Config->mc_ClassList.mlh_Head);
  740.         class->mec_Node.mln_Succ;
  741.         class = (struct MRQEventClass*)(class->mec_Node.mln_Succ))
  742.     {
  743.         for(str = (struct MRQString*)(class->mec_StringList.mlh_Head);
  744.             str->ms_Node.mln_Succ;
  745.             str = (struct MRQString*)(str->ms_Node.mln_Succ))
  746.         {
  747.             tx = (str->ms_Flags & MSF_FORMATTED) ? FormattedText : Text;
  748.  
  749.             if(str->ms_Flags & MSF_SUBSTRING)
  750.             {
  751.                 if(str->ms_Flags & MSF_NOCASE)
  752.                     match = (BOOL)mb_stristr(tx,str->ms_String);
  753.                 else
  754.                     match = (BOOL)strstr(tx,str->ms_String);
  755.             }
  756.             else if(str->ms_Flags & MSF_PATTERN)
  757.             {
  758.                 if(str->ms_Flags & MSF_NOCASE) match = MatchPatternNoCase(str->ms_String,tx);
  759.                 else match = MatchPattern(str->ms_String,tx);
  760.             }
  761.             else
  762.             {
  763.                 if(str->ms_Flags & MSF_NOCASE) match = (stricmp(str->ms_String,tx) == 0);
  764.                 else match = (strcmp(str->ms_String,tx) == 0);
  765.             }
  766.  
  767.             if(match) return class;
  768.         }
  769.     }
  770.     return &Config->mc_DefClass;
  771. }
  772.  
  773.  
  774. /************************************************************************
  775. ** CreateMRQButton()
  776. ** The one and only button creation function, delegates work to 
  777. ** CreateImageButton() and CreateTextButton().
  778. ** Parameters:
  779. ** first/last: indicate if button to make is the first or last in a
  780. **             requester
  781. ** scr       : screen to remap image stuff to, if any
  782. ** uscore    : character to be used as "underscore", this precedes any
  783. **             character that is to be underlined and used as a keyboard
  784. **             shortcut
  785. ** defbutton : indicates that this button is the default response button
  786. **             and its text should be printed in boldface
  787. ** 
  788. *************************************************************************/
  789. static APTR CreateMRQButton(STRPTR text, BOOL first, BOOL last, struct Screen *scr, UBYTE uscore, BOOL defbutton)
  790. {
  791. STRPTR PMatchText, PParseText;
  792. APTR ret=NULL;
  793. UWORD cchar=0;    // MUI button controlchar
  794.  
  795.  
  796.     if(uscore)
  797.     {
  798.         if((cchar = PreParseButtonText(text,uscore,defbutton,&PMatchText,&PParseText)) == -1) return NULL;
  799.     } else
  800.     {
  801.         PMatchText = PParseText = text;
  802.     }
  803.  
  804.     /* analyze text if requested, unless button is the first one and should be marked "OK" */
  805.     if(ttVars.IButtonsByText && (!(first && ttVars.SingleIsOK)))
  806.     {
  807.     int i;
  808.     STRPTR s;
  809.     struct MRQImageButton *ibuttons[3];
  810.     UBYTE stringbuf[256];
  811.     static BOOL ButtonUsed[3];
  812.  
  813.         ibuttons[0] = &Config->mc_IButton_Yes;
  814.         ibuttons[1] = &Config->mc_IButton_No;
  815.         ibuttons[2] = &Config->mc_IButton_Cancel;
  816.  
  817.         if(first) ButtonUsed[0] = ButtonUsed[1] = ButtonUsed[2] = FALSE;
  818.  
  819.         for(i=0; i<3; i++)        
  820.         {
  821.             if(ButtonUsed[i]) continue;        // don't use same button twice
  822.             mb_strlimcpy(stringbuf,ibuttons[i]->mib_Text,256);
  823.             s = strtok(stringbuf,"|");
  824.             while(s)
  825.             {
  826.                 if(mb_stristr(PMatchText,s))
  827.                 {
  828.                     prdebug("CreateMRQButton(): matched '%s' -> button #%ld\n",s,i);
  829.                     ButtonUsed[i] = TRUE;
  830.                     ret = CreateImageButton(PParseText,ibuttons[i],scr,cchar,defbutton);
  831.                 }
  832.                 s = strtok(NULL,"|");
  833.             }
  834.         }
  835.     } else
  836.     {
  837.         if(first && Config->mc_IButton_Yes.mib_Picture)
  838.         {
  839.             ret = CreateImageButton(PParseText,&Config->mc_IButton_Yes,scr,cchar,defbutton);
  840.         } else if(last && Config->mc_IButton_No.mib_Picture)
  841.         {
  842.             ret = CreateImageButton(PParseText,&Config->mc_IButton_No,scr,cchar,defbutton);
  843.         }
  844.     }
  845.     if(!ret) ret = CreateTextButton(PParseText,cchar,defbutton);
  846.     prdebug("CreateMRQButton: button created @@$%08.lx\n",ret);
  847.  
  848.     if(uscore)
  849.     {
  850.         FreeVecPooled(Config->mc_MemPool,PMatchText);
  851.         FreeVecPooled(Config->mc_MemPool,PParseText);
  852.     }
  853.     set(ret,MUIA_CycleChain,1);
  854.     return ret;
  855. }
  856.  
  857.  
  858.  
  859. /************************************************************************
  860. ** CreateImageButton()
  861. ** Creates a button with text an an image on the left
  862. **
  863. ** ctlchar and defbutton: see CreateTextButton()
  864. *************************************************************************/
  865. static APTR CreateImageButton(STRPTR text, struct MRQImageButton *img, struct Screen *scr, UBYTE ctlchar, BOOL defbutton)
  866. {
  867. APTR button;
  868.  
  869.     button = 
  870.     VGroup,
  871.         ButtonFrame,
  872.         MUIA_InputMode, MUIV_InputMode_RelVerify,
  873.         MUIA_Background, MUII_ButtonBack,
  874.         Child, VSpace(0),
  875.         Child, HGroup,
  876.             Child, GuigfxObject,
  877.                 MUIA_Guigfx_Picture, img->mib_Picture,
  878.                 MUIA_Guigfx_ScaleMode, GGSMF_NONE,
  879.                 MUIA_Guigfx_Quality, ttVars.Quality,
  880.                 MUIA_Guigfx_Transparency, GGTRF_MASK,
  881.             End,
  882.             Child, TextObject,
  883.                 MUIA_Font, MUIV_Font_Button,
  884.                 MUIA_Text_Contents, text,
  885.                 MUIA_Text_PreParse, (defbutton ? "\33c\33b" : "\33c"),
  886.             End,
  887.         End,
  888.         Child, VSpace(0),
  889.     End;
  890.  
  891.     if(button && ctlchar)
  892.     {
  893.         set(button,MUIA_ControlChar,(LONG)ctlchar);
  894.     }
  895.  
  896.     return button;
  897. }
  898.  
  899. /************************************************************************
  900. ** CreateTextButton()
  901. ** Creates a button with only text in it.
  902. ** Optional: text rendering in boldface if defbutton is set; keyboard
  903. ** shortcut if ctlchar is set
  904. *************************************************************************/
  905. static APTR CreateTextButton(STRPTR text, UBYTE ctlchar, BOOL defbutton)
  906. {
  907. APTR button;
  908.  
  909.     if(Config->mc_IButton_Yes.mib_Picture ||
  910.         Config->mc_IButton_No.mib_Picture  ||
  911.         Config->mc_IButton_Cancel.mib_Picture)
  912.     {
  913.     /* use a height adaptive layout if imagebuttons are used */
  914.         button =
  915.         VGroup,
  916.             ButtonFrame,
  917.             MUIA_InputMode, MUIV_InputMode_RelVerify,
  918.             MUIA_Background, MUII_ButtonBack,
  919.             Child, VSpace(0),
  920.             Child, TextObject,
  921.                 MUIA_Font, MUIV_Font_Button,
  922.                 MUIA_Text_Contents, text,
  923.                 MUIA_Text_PreParse, (defbutton ? "\33c\33b" : "\33c"),
  924.             End,
  925.             Child, VSpace(0),
  926.         End;
  927.     } else
  928.     {
  929.         button =
  930.         TextObject,
  931.         ButtonFrame,
  932.         MUIA_InputMode, MUIV_InputMode_RelVerify,
  933.         MUIA_Background, MUII_ButtonBack,
  934.             MUIA_Font, MUIV_Font_Button,
  935.             MUIA_Text_Contents, text,
  936.             MUIA_Text_PreParse, (defbutton ? "\33c\33b" : "\33c"),
  937.         End;
  938.     }
  939.  
  940.     if(button && ctlchar)
  941.     {
  942.         set(button,MUIA_ControlChar,(LONG)ctlchar);
  943.     }
  944.  
  945.     return button;
  946. }
  947.  
  948.  
  949. /************************************************************************
  950. ** PreParseButtonText()
  951. ** Using a certain "underscore" character, this function scans the input
  952. ** text and generates two variants: one for pattern matching, without
  953. ** the underscore character(s), one for MUI, including formatting codes
  954. ** to set the font style to "underlined" for the one character following
  955. ** the first "underscore" and "boldface" for the default button.
  956. ** Returns the character to use for the button's MUIA_ControlChar or -1
  957. ** on failure
  958. *************************************************************************/
  959. static WORD PreParseButtonText(STRPTR text, UBYTE uscore, BOOL defbutton, STRPTR *PMatchText, STRPTR *PParseText)
  960. {
  961. ULONG slen;
  962. WORD hichar=0;
  963.  
  964.     slen = strlen(text)+1;
  965.  
  966.     if((*PMatchText = AllocVecPooled(Config->mc_MemPool,slen)) &&
  967.         (*PParseText = AllocVecPooled(Config->mc_MemPool,slen+6)))
  968.     {
  969.     STRPTR s,t;
  970.     UBYTE c;
  971.  
  972.         s = *PMatchText;
  973.         t = text;
  974.         do
  975.         {
  976.             c = *t++;
  977.             if(c != uscore) *s++ = c;    // omit <underscore> characters
  978.         } while(c);
  979.  
  980.         s = *PParseText;
  981.         t = text;
  982.         do
  983.         {
  984.             c = *t++;
  985.             if(c == uscore)
  986.             {
  987.                 *s++ = 0x1b;                // ESC
  988.                 *s++ = 'u';                    // underline
  989.                 *s++ = hichar = *t++;    // save underlined character
  990.                 *s++ = 0x1b;                // ESC
  991.                 *s++ = 'n';                    // normal
  992.                 if(defbutton)
  993.                 {
  994.                     *s++ = 0x1b;            // ESC
  995.                     *s++ = 'b';                // boldface
  996.                 }
  997.                     
  998.                 do
  999.                 {
  1000.                     c = *t++;
  1001.                     if(c != uscore) *s++ = c;    // just omit further <underscore> characters
  1002.                 } while(c);
  1003.             } else
  1004.             {
  1005.                 *s++ = c;
  1006.             }
  1007.         } while(c);
  1008.  
  1009.         hichar = tolower(hichar);
  1010.  
  1011.         return hichar;
  1012.     } else
  1013.     {
  1014.         if(PMatchText) FreeVecPooled(Config->mc_MemPool,PMatchText);
  1015.         return -1;
  1016.     }
  1017. }
  1018. @
  1019.  
  1020.  
  1021. 1.3
  1022. log
  1023. @Changed NewImage.mcc -> Guigfx.mcc
  1024. @
  1025. text
  1026. @d13 1
  1027. a13 1
  1028. /* $Id: Requesters.c 1.2 2000/01/25 17:30:22 msbethke Exp msbethke $
  1029. d16 3
  1030. d55 1
  1031. d64 4
  1032. d86 4
  1033. a89 4
  1034.     if((MyTask->tc_Node.ln_Type == NT_PROCESS) && (!pwindow))
  1035.     {
  1036.         pwindow = ((struct Process*)MyTask)->pr_WindowPtr;
  1037.     }
  1038. d163 3
  1039. a165 2
  1040.     if((MyTask->tc_Node.ln_Type == NT_PROCESS) && (!pwindow))
  1041.         pwindow = ((struct Process*)MyTask)->pr_WindowPtr;
  1042. d416 1
  1043. a416 1
  1044. UBYTE tbuf[1024], gadbuf[128];
  1045. a420 1
  1046. struct Window *ParentWindow;
  1047. d422 2
  1048. a423 3
  1049. STRPTR s,ts;
  1050. APTR BtArgs;
  1051. BOOL MoreButtons, GoodButtons, IconShown=FALSE;
  1052. a424 1
  1053.  
  1054. a429 1
  1055.     ParentWindow= msg->mrm_ParentWin;
  1056. d440 1
  1057. a440 1
  1058.         if(ParentWindow)
  1059. d442 1
  1060. a442 1
  1061.             scr = ParentWindow->WScreen;
  1062. d452 1
  1063. a452 1
  1064.     BtArgs = RawDoFmt(TextFormat,msg->mrm_ArgList,&RDF_StuffChar,&StuffCharParams);
  1065. d466 1
  1066. a466 1
  1067.                 IconImageInfo.Version = NEWIMAGE_IMAGEINFO_VERSION;
  1068. d502 1
  1069. a502 1
  1070.                             MUIA_Guigfx_ScaleMode, NISMF_NONE,
  1071. d504 1
  1072. a504 1
  1073.                             MUIA_Guigfx_Transparency, ttVars.Transparency ? NITRF_MASK : 0,
  1074. d556 1
  1075. a556 3
  1076.     APTR TButtonP;
  1077.     BOOL defaultbutton;
  1078.     int i;
  1079. d562 1
  1080. a562 2
  1081.         set(Win,MRQWINDOWTAG_REQMESSAGE,msg);    // keep this *before*
  1082.                                                             // the AddEventHandler call!
  1083. d570 1
  1084. a570 9
  1085.         StuffCharParams.Position= 0;
  1086.         StuffCharParams.Dest        = tbuf;
  1087.         StuffCharParams.DestLen = sizeof(tbuf);
  1088.         
  1089.         RawDoFmt(GadgetFormat,BtArgs,&RDF_StuffChar,&StuffCharParams);
  1090.  
  1091.         ts = s = tbuf;
  1092.  
  1093.         for(i=0,MoreButtons=GoodButtons=TRUE; MoreButtons&&GoodButtons;)
  1094. d572 13
  1095. a584 2
  1096.             /* advance to next gadget marker */
  1097.             while(*s && (*s != '|')) s++;
  1098. d586 3
  1099. a588 3
  1100.             /* if neither current nor next-to-current char is 0 and i has not reached
  1101.                 MAXBUTTONS yet, then there will be more gadgets */
  1102.             MoreButtons = ((s[0] != '\0') && (s[1] != '\0') && (i<MAXBUTTONS));
  1103. d590 2
  1104. a591 3
  1105.             /* copy substring and terminate it */
  1106.             memcpy(gadbuf,ts,(size_t)(max(s-ts,sizeof(gadbuf)-1)));
  1107.             gadbuf[s-ts] = '\0';
  1108. d593 2
  1109. a594 2
  1110.             /* set ts to start of next gadgetformat string */
  1111.             ts = ++s;
  1112. d596 22
  1113. a617 4
  1114.             /* try to create a new MUI button */
  1115.             TButtonP = CreateMRQButton(gadbuf,!i,!MoreButtons,scr,msg->mrm_Underscore,
  1116.                                                 defaultbutton= (msg->mrm_DefaultAnswer==i+1) ||
  1117.                                                                     (!MoreButtons&&(msg->mrm_DefaultAnswer==0)));
  1118. d619 1
  1119. a619 1
  1120.             if(TButtonP)
  1121. d621 5
  1122. a625 1
  1123.                 DoMethod(BtGrp,OM_ADDMEMBER,TButtonP);
  1124. d627 1
  1125. a627 2
  1126.                 DoMethod(TButtonP,MUIM_Notify,MUIA_Pressed,FALSE,TButtonP,3,
  1127.                             MUIM_WriteLong,(MoreButtons||!i)?i+1:0,&msg->mrm_RCode);
  1128. d629 1
  1129. a629 2
  1130.                 DoMethod(TButtonP,MUIM_Notify,MUIA_Pressed,FALSE,Application,2,
  1131.                             MUIM_Application_ReturnID,msg);
  1132. d631 4
  1133. a634 6
  1134.                 if(i<10)
  1135.                 {
  1136.                 ULONG fstring=MAKE_ID('f',0,0,0);
  1137.                 
  1138.                     if(i==9) fstring |= MAKE_ID(0,'1','0',0);
  1139.                     else fstring |= (i+1+'0')<<16;
  1140. d636 4
  1141. a639 2
  1142.                     DoMethod(Win,MUIM_Notify,MUIA_Window_InputEvent,&fstring,
  1143.                                 Win,3,MUIM_WriteLong,(MoreButtons||!i)?i+1:0,&msg->mrm_RCode);
  1144. d641 4
  1145. a644 3
  1146.                     DoMethod(Win,MUIM_Notify,MUIA_Window_InputEvent,&fstring,
  1147.                                 Application,2,MUIM_Application_ReturnID,msg);
  1148.                 }
  1149. a645 2
  1150.                 if(defaultbutton && (!(msg->mrm_Flags & MRQMF_NORETURNKEY)))
  1151.                     set(Win,MUIA_Window_ActiveObject,TButtonP);
  1152. d647 1
  1153. a647 1
  1154.                 i++;
  1155. d650 2
  1156. a651 11
  1157.                 GoodButtons = FALSE;
  1158.                 break;
  1159.             }
  1160.         }
  1161.  
  1162.         if(GoodButtons)
  1163.         {
  1164.             if(EventClass->mec_RxCmdString)
  1165.             {
  1166.                 msg->mrm_ARexxPort= EventClass->mec_RxPortName ? EventClass->mec_RxPortName : (STRPTR)"PLAY";
  1167.                 msg->mrm_ARexxCmd    = EventClass->mec_RxCmdString;
  1168. d653 2
  1169. a654 23
  1170.  
  1171.             DoMethod(Application,OM_ADDMEMBER,Win);
  1172.  
  1173.             prdebug("Added window to application object\n");
  1174.  
  1175.             DoMethod(Win,MUIM_Notify,MUIA_Window_InputEvent,"esc",
  1176.                         Win,3,MUIM_WriteLong,0,&msg->mrm_RCode);
  1177.             DoMethod(Win,MUIM_Notify,MUIA_Window_InputEvent,"esc",
  1178.                         Application,2,MUIM_Application_ReturnID,msg);
  1179.  
  1180.             DoMethod(Win,MUIM_Notify,MUIA_Window_InputEvent,"lcommand v",
  1181.                         Win,3,MUIM_WriteLong,1,&msg->mrm_RCode);
  1182.             DoMethod(Win,MUIM_Notify,MUIA_Window_InputEvent,"lcommand v",
  1183.                         Application,2,MUIM_Application_ReturnID,msg);
  1184.  
  1185.             DoMethod(Win,MUIM_Notify,MUIA_Window_InputEvent,"lcommand b",
  1186.                         Win,3,MUIM_WriteLong,0,&msg->mrm_RCode);
  1187.             DoMethod(Win,MUIM_Notify,MUIA_Window_InputEvent,"lcommand b",
  1188.                         Application,2,MUIM_Application_ReturnID,msg);
  1189.  
  1190.  
  1191.             set(Win,MUIA_Window_Open,TRUE);
  1192.         } else
  1193. d656 1
  1194. a656 1
  1195.             prdebug("Error creating button objects!\n");
  1196. d665 1
  1197. a665 1
  1198.     if(!(ttVars.FrontmostScreen || ParentWindow)) UnlockPubScreen(NULL,scr);
  1199. d669 14
  1200. d763 2
  1201. a764 1
  1202.     if(ttVars.IButtonsByText)
  1203. d787 1
  1204. d799 1
  1205. a799 2
  1206.         } 
  1207.         if(last && Config->mc_IButton_No.mib_Picture)
  1208. d837 1
  1209. a837 1
  1210.                 MUIA_Guigfx_ScaleMode, NISMF_NONE,
  1211. d839 1
  1212. a839 1
  1213.                 MUIA_Guigfx_Transparency, NITRF_MASK,
  1214. @
  1215.  
  1216.  
  1217. 1.2
  1218. log
  1219. @Adapted to new header names
  1220. Fixed obsolete NewImage.mcc tag names/structures
  1221. @
  1222. text
  1223. @d13 1
  1224. a13 1
  1225. /* $Id: Requesters.c 1.1 2000/01/25 16:57:49 msbethke Exp msbethke $
  1226. d16 4
  1227. d33 2
  1228. a43 1
  1229. #include "MUI/NewImage_mcc.h"
  1230. d410 1
  1231. a410 1
  1232. struct MUIP_NewImage_ImageInfo IconImageInfo;
  1233. d453 1
  1234. a453 1
  1235.         prdebug("default class - trying icon\n");
  1236. d463 1
  1237. a463 1
  1238.                 IconImageInfo.ColorTable = (ULONG*)MUIV_NewImage_WBPalette;        // we want a new WB-like palette
  1239. d482 21
  1240. d518 1
  1241. a518 8
  1242.                     Child, ReqImgObj = NewImageObject,
  1243.                             (ReqImage->mi_Flags & MIF_FILENAME) ? MUIA_NewImage_FileName :
  1244.                             IconShown ? MUIA_NewImage_ImageInfo : MUIA_NewImage_Picture,
  1245.                         ReqImage->mi_Object,
  1246.                         MUIA_NewImage_ScaleMode, NISMF_NONE,
  1247.                         MUIA_NewImage_Quality, ttVars.Quality,
  1248.                         MUIA_NewImage_Transparency, ttVars.Transparency ? NITRF_MASK : 0,
  1249.                     End,
  1250. d827 5
  1251. a831 5
  1252.             Child, NewImageObject,
  1253.                 MUIA_NewImage_Picture, img->mib_Picture,
  1254.                 MUIA_NewImage_ScaleMode, NISMF_NONE,
  1255.                 MUIA_NewImage_Quality, ttVars.Quality,
  1256.                 MUIA_NewImage_Transparency, NITRF_MASK,
  1257. @
  1258.  
  1259.  
  1260. 1.1
  1261. log
  1262. @Initial revision
  1263. @
  1264. text
  1265. @d13 5
  1266. a17 1
  1267. /* $Id:$
  1268. a18 1
  1269. ** $Log:$
  1270. d34 2
  1271. a35 2
  1272. #include "mrq_config.h"
  1273. #include "mrq_dtypes.h"
  1274. d405 1
  1275. a405 1
  1276. struct NewImage_ImageInfo IconImageInfo;
  1277. d494 1
  1278. a494 1
  1279.                             IconShown ? MUIA_NewImage_Image : MUIA_NewImage_Picture,
  1280. @
  1281.